{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "portfolio_demo2.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.8.3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/xinihe/jrxy_portfolio_management/blob/master/Code/portfolio_demo2.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "WNSWvAoKawHB",
        "outputId": "40865570-370d-437e-8766-39dba1d2fbfe"
      },
      "source": [
        "!pip install sqlalchemy\n",
        "!pip install pymysql\n",
        "!pip install tushare"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Requirement already satisfied: sqlalchemy in /usr/local/lib/python3.7/dist-packages (1.4.3)\n",
            "Requirement already satisfied: greenlet!=0.4.17; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from sqlalchemy) (1.0.0)\n",
            "Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from sqlalchemy) (3.8.1)\n",
            "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->sqlalchemy) (3.4.1)\n",
            "Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->sqlalchemy) (3.7.4.3)\n",
            "Collecting pymysql\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/4f/52/a115fe175028b058df353c5a3d5290b71514a83f67078a6482cff24d6137/PyMySQL-1.0.2-py3-none-any.whl (43kB)\n",
            "\u001b[K     |████████████████████████████████| 51kB 2.4MB/s \n",
            "\u001b[?25hInstalling collected packages: pymysql\n",
            "Successfully installed pymysql-1.0.2\n",
            "Collecting tushare\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/17/76/dc6784a1c07ec040e748c8e552a92e8f4bdc9f3e0e42c65699efcfee032b/tushare-1.2.62-py3-none-any.whl (214kB)\n",
            "\u001b[K     |████████████████████████████████| 215kB 5.3MB/s \n",
            "\u001b[?25hRequirement already satisfied: requests>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from tushare) (2.23.0)\n",
            "Requirement already satisfied: lxml>=3.8.0 in /usr/local/lib/python3.7/dist-packages (from tushare) (4.2.6)\n",
            "Requirement already satisfied: bs4>=0.0.1 in /usr/local/lib/python3.7/dist-packages (from tushare) (0.0.1)\n",
            "Collecting simplejson>=3.16.0\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/a8/04/377418ac1e530ce2a196b54c6552c018fdf1fe776718053efb1f216bffcd/simplejson-3.17.2-cp37-cp37m-manylinux2010_x86_64.whl (128kB)\n",
            "\u001b[K     |████████████████████████████████| 133kB 7.7MB/s \n",
            "\u001b[?25hCollecting websocket-client>=0.57.0\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/08/33/80e0d4f60e84a1ddd9a03f340be1065a2a363c47ce65c4bd3bae65ce9631/websocket_client-0.58.0-py2.py3-none-any.whl (61kB)\n",
            "\u001b[K     |████████████████████████████████| 61kB 4.0MB/s \n",
            "\u001b[?25hRequirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests>=2.0.0->tushare) (2020.12.5)\n",
            "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests>=2.0.0->tushare) (3.0.4)\n",
            "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests>=2.0.0->tushare) (1.24.3)\n",
            "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests>=2.0.0->tushare) (2.10)\n",
            "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.7/dist-packages (from bs4>=0.0.1->tushare) (4.6.3)\n",
            "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from websocket-client>=0.57.0->tushare) (1.15.0)\n",
            "Installing collected packages: simplejson, websocket-client, tushare\n",
            "Successfully installed simplejson-3.17.2 tushare-1.2.62 websocket-client-0.58.0\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "CvoLjl7If_UG"
      },
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import random\n",
        "import time\n",
        "import matplotlib.pyplot as plt\n",
        "from sqlalchemy import create_engine\n",
        "# 数据库连接信息，该数据库保存了近两年的股票数据\n",
        "con = create_engine('mysql+pymysql://study:524524524@47.93.28.75/test')\n",
        "\n",
        "def set_portfolio(codes, con = con):\n",
        "  ret_list = pd.DataFrame()\n",
        "  for code in codes:\n",
        "    # 循环读入股票信息\n",
        "    dat = pd.read_sql_table(code,con, columns = ['pct_chg'], index_col = 'trade_date')\n",
        "    dat.rename(columns = {'pct_chg':code}, inplace=True) #将列标签换成股票的ts_code\n",
        "    # 合并不同股票的日收益\n",
        "    ret_list = pd.concat([ret_list, dat], axis = 1 ,join = 'outer', ignore_index = False, sort = False)\n",
        "  # 去掉空值行\n",
        "  ret_list.dropna(axis = 0, how = 'any', inplace = True)\n",
        "  return ret_list"
      ],
      "execution_count": 3,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YNC7ulCoU-Og"
      },
      "source": [
        "# 资产配置"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wcHikSP3VTG4"
      },
      "source": [
        "### 根据公式\n",
        "\n",
        "$$\n",
        "W = \\left\\{ \\begin{matrix} \\omega_1 & \\omega_2 \\end{matrix} \\right\\}\n",
        "$$\n",
        "$$\n",
        "\\Omega = \\left\\{ \\begin{matrix} \\sigma_{11} & \\sigma_{12}\\\\ \\sigma_{21} & \\sigma_{22} \n",
        "\\end{matrix} \\right\\}\n",
        "$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "r47T1zPaVZj3"
      },
      "source": [
        "可以得出 \n",
        "$$\n",
        "\\sigma_p = W \\Omega W^T\n",
        "$$\n",
        "\n",
        "其中$\\sigma_p$为组合资产的标准差"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "dvNycG5AlZMP"
      },
      "source": [
        "codes = ['000002','000100','000776','600030','600177']\n",
        "#codes = ['000002','399300']\n",
        "ret_list = set_portfolio(codes) "
      ],
      "execution_count": 48,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "TpdRdVdTmdKP"
      },
      "source": [
        "from scipy import stats\n",
        "def multi_corr(ret_list_pair, winlen = 50, N = 100):\n",
        "    print('Correlation coefficent between '+ret_list_pair.columns.values[0]+' and '+ret_list_pair.columns.values[1]+' is: ' + str(np.round(np.corrcoef(ret_list_pair.T)[0,1], 3)))\n",
        "    corr_list = []\n",
        "    for i in range(N):\n",
        "        start = np.random.randint(len(ret_list_pair) - winlen)\n",
        "        corr_list.append(np.corrcoef(ret_list_pair.iloc[start:start+winlen,0],ret_list_pair.iloc[start:start+winlen,1])[0,1])        \n",
        "    print('Average correlation is: '+str(round(np.mean(corr_list),3))+' with std= '+ str(round(np.std(corr_list),3)))  \n",
        "    # Display\n",
        "    plt.figure()\n",
        "    plt.hist(corr_list, bins=20)\n",
        "    plt.show()  \n",
        "    print('Kurtosis is: '+ str(round(stats.kurtosis(corr_list),3)) + '; Shewness is ' + str(round(stats.skew(corr_list),3)))"
      ],
      "execution_count": 5,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 316
        },
        "id": "2tAYOCo1me2J",
        "outputId": "8c01260c-15e7-4998-8312-0b283e1447d6"
      },
      "source": [
        "multi_corr(ret_list)"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Correlation coefficent between 000002 and 000100 is: 0.271\n",
            "Average correlation is: 0.245 with std= 0.156\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        },
        {
          "output_type": "stream",
          "text": [
            "Kurtosis is: -0.765; Shewness is -0.145\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "BT2CgTtrnuoj"
      },
      "source": [
        "def port_stat(ret_list, num_assets, num_ports, short_sell = 0):\n",
        "\n",
        "    weights = np.random.random([num_ports,num_assets]) if short_sell == 0 else np.random.randn(num_ports,num_assets) #根据组合数和投资的资产数建立一个矩阵\n",
        "    #np.random.random([ ，])生成的是0～1之间的小数；np.random.randn( ， )生成的是服从标准正态的数。\n",
        "    weights = weights / (np.mat(np.sum(weights, axis = 1)).T* np.ones([1,num_assets]))\n",
        "    cov_matrix = np.cov(ret_list.T)\n",
        "    \n",
        "    risk_matrix = weights * cov_matrix * weights.T\n",
        "    ports_risks = np.sqrt(np.diag(risk_matrix)) #diag函数返回对角线元素\n",
        "    ports_risks = ports_risks.reshape(-1,1) #重塑成一列\n",
        "    ports_returns = np.array(weights * np.mat(np.mean(ret_list.values, axis = 0)).T)\n",
        "    \n",
        "    return ports_risks, ports_returns, cov_matrix, weights"
      ],
      "execution_count": 7,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 315
        },
        "id": "s_dU0hMxnxF9",
        "outputId": "b8826ca2-ee68-44c9-87a6-eaf8eaa80178"
      },
      "source": [
        "# calculate portfolio with 2 assets\n",
        "num_ports = 100 #组合的数量\n",
        "n = 2\n",
        "ports_risks, ports_returns, cov_matrix, weights = port_stat(ret_list.iloc[:,:n], n, num_ports)\n",
        "\n",
        "fig, ax = plt.subplots()\n",
        "ax.scatter(ports_risks, ports_returns, alpha=0.4) #资产随机配置时的风险与收益率\n",
        "ax.scatter(np.sqrt(np.diag(cov_matrix)), np.mean(ret_list.iloc[:,:n].values, axis = 0), c = '#FF0000', alpha=0.4) #全部买这个资产的风险与收益率\n",
        "ax.set_title('The risk and return of the selected asset')\n",
        "ax.set_xlabel('$\\sigma_p$')\n",
        "ax.set_ylabel('$R_p$')"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Text(0, 0.5, '$R_p$')"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 8
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 315
        },
        "id": "ZuTWTj5joB_x",
        "outputId": "aa594340-bf54-4011-cad6-22a2f928908c"
      },
      "source": [
        "# calculate portfolio with 3 or more assets\n",
        "num_ports = 1000\n",
        "n = 3\n",
        "ports_risks, ports_returns, cov_matrix, weights = port_stat(ret_list.iloc[:,:n], n, num_ports)\n",
        "\n",
        "fig, ax = plt.subplots()\n",
        "ax.scatter(ports_risks, ports_returns, alpha=0.4) #资产随机配置时的风险与收益率\n",
        "ax.scatter(np.sqrt(np.diag(cov_matrix)), np.mean(ret_list.iloc[:,:n].values, axis = 0), c = '#FF0000', alpha=0.4) #全部买这个资产的风险与收益率\n",
        "ax.set_title('The risk and return of the selected asset')\n",
        "ax.set_xlabel('$\\sigma_p$')\n",
        "ax.set_ylabel('$R_p$')"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Text(0, 0.5, '$R_p$')"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 9
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Ln7OPq9HwO7y"
      },
      "source": [
        "***"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "38iFxc67VwPA"
      },
      "source": [
        "# 风险风散"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oj0Y-sftV3Rk"
      },
      "source": [
        "### 我们基于以下公式来实现资产的风险风散\n",
        "$$\n",
        "\\sigma_p^2 = \\sum_{i=1}^N(W_i^2 \\sigma_i^2)+\\sum_{j=1}^N \\sum_\\underset{k\\neq j}{k=1}^N(W_jW_k\\sigma_{jk})\n",
        "\\\\\n",
        "= \\sum_{i=1}^N\\frac{\\sigma_i^2}{N^2} +\\sum_{j=1}^N \\sum_\\underset{k\\neq j}{k=1}^N\\frac{1}{N}\\frac{1}{N}\\sigma_{jk}\n",
        "\\\\\n",
        "=\\frac{1}{N}\\sum_{i=1}^N\\frac{\\sigma_i^2}{N}+\\frac{N-1}{N}\\sum_{j=1}^N\\sum_\\underset{k\\neq j}{k=1}^N\\frac{\\sigma_{jk}}{N(N-1)}\n",
        "$$\n",
        "\n",
        "可以看到，当N足够大时，组合的特质性风险被分散，只剩下系统性风险"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "F_JOJkZDybW0"
      },
      "source": [
        "from sqlalchemy import create_engine\n",
        "import random\n",
        "con = create_engine('mysql+pymysql://study:524524524@47.93.28.75/test')\n",
        "cs = pd.read_sql_table('cis300',con, columns = ['con_code'])\n",
        "codes = [c.split('.')[0] for c in list(cs['con_code'])]\n",
        "random_select = list(set(random.choices(codes, k = 50)))\n",
        "ret_list = set_portfolio(random_select)"
      ],
      "execution_count": 62,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 312
        },
        "id": "WArLXN4I06Nl",
        "outputId": "f0c672be-ddf2-4f7b-d866-4b535b654e7d"
      },
      "source": [
        "p_risk = []\n",
        "for i in range(len(random_select)):\n",
        "  n = i + 1\n",
        "  p_risk.append(np.dot(np.dot(1/n * np.ones([1,n]), ret_list.iloc[:,:n].cov().values), np.ones([n,1]) * 1/n))\n",
        "\n",
        "# 作图\n",
        "fig, ax = plt.subplots(figsize=(6, 4))\n",
        "ax.plot(range(len(random_select)),np.squeeze(p_risk))\n",
        "ax.set_title('Average Portfolio Risk')\n",
        "ax.set_xlabel('Number of Stocks in Portfolio')\n",
        "ax.set_ylabel('Standard Deviation(%)')"
      ],
      "execution_count": 63,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Text(0, 0.5, 'Standard Deviation(%)')"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 63
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 299
        },
        "id": "NCYU5y4koN2J",
        "outputId": "5ff82ada-191b-4872-d286-af054067a33e"
      },
      "source": [
        "# Average diversification\n",
        "plt.figure()\n",
        "plt.hist(ports_risks, bins = 20)\n",
        "plt.show()\n",
        "print('The average risks of components stocks is: ' + str(np.mean(np.sqrt(np.diag(cov_matrix)))))\n",
        "print('The average risks of portfolios is: ' + str(np.mean(ports_risks)))"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        },
        {
          "output_type": "stream",
          "text": [
            "The average risks of components stocks is: 2.4156845843297776\n",
            "The average risks of portfolios is: 1.9874737549595995\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Lw_V6jxMwtK4"
      },
      "source": [
        "***"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UAP09JF7X74h"
      },
      "source": [
        "# 资产配置线"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 370
        },
        "id": "FX__yyh2oxaF",
        "outputId": "b10e3eae-de62-4d3b-e408-fc4a6d41cfaf"
      },
      "source": [
        "# Capital Allocation Line\n",
        "def sharpe(ports_risks, ports_returns, risk_free_rate):  #计算夏普比率\n",
        "    return (ports_returns - risk_free_rate) / ports_risks\n",
        "\n",
        "risk_free_rate = 0.02\n",
        "ind_max_sharpe = np.argmax(sharpe(ports_risks, ports_returns, risk_free_rate)) #找出夏普比率最大的配置情况\n",
        "\n",
        "plt.figure()\n",
        "plt.scatter(ports_risks, ports_returns, alpha=0.4)\n",
        "plt.scatter(np.sqrt(np.diag(cov_matrix)), np.mean(ret_list.iloc[:,:n].values, axis = 0), c = 'darkblue', alpha= 1 )\n",
        "plt.scatter([0,ports_risks[ind_max_sharpe]], [risk_free_rate, ports_returns[ind_max_sharpe]], alpha=1, c = 'red') #画出使得夏普比率最大的资产配置线\n",
        "plt.plot(np.array([0,ports_risks[ind_max_sharpe]]),np.array([risk_free_rate, ports_returns[ind_max_sharpe]]), alpha=0.3, c = 'red')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/numpy/ma/core.py:2832: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray\n",
            "  order=order, subok=True, ndmin=ndmin)\n",
            "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:12: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray\n",
            "  if sys.path[0] == '':\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7f055240a990>]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 12
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 353
        },
        "id": "g0u7Oiigo9ok",
        "outputId": "5703ffe4-de45-4b14-d1ea-c715be7a7778"
      },
      "source": [
        "# Complete optimal portfolio\n",
        "\n",
        "def utility_func(cports_risks, cports_returns, aversion): #构建效用函数\n",
        "    return cports_returns - 0.005 * aversion * cports_risks * cports_risks\n",
        "\n",
        "aversion = 6\n",
        "num = 50\n",
        "cports_risks = np.linspace(0,ports_risks[ind_max_sharpe], num = num) \n",
        "cports_returns = np.linspace(risk_free_rate,ports_returns[ind_max_sharpe], num = num)\n",
        "index_comp_port = np.argmax(utility_func(cports_risks, cports_returns, aversion))\n",
        "\n",
        "plt.figure()\n",
        "# opportunity sets\n",
        "plt.scatter(ports_risks, ports_returns, alpha=0.4)\n",
        "# original assets\n",
        "plt.scatter(np.sqrt(np.diag(cov_matrix)), np.mean(ret_list.iloc[:,:n].values, axis = 0), c = 'darkblue', alpha= 1 )\n",
        "# Risk free asset and max sharpe portfolio\n",
        "plt.scatter([0,ports_risks[ind_max_sharpe]], [risk_free_rate, ports_returns[ind_max_sharpe]], alpha= 0.5, c = 'orange')\n",
        "# Capital allocation line\n",
        "plt.plot(np.array([0,ports_risks[ind_max_sharpe]]),np.array([risk_free_rate, ports_returns[ind_max_sharpe]]), alpha= 0.3, c = 'red')\n",
        "# Complete optimal portfolio\n",
        "plt.scatter(cports_risks[index_comp_port], cports_returns[index_comp_port], alpha= 1, c = 'darkred') #在资产配置线上找到使得效用最大的点"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/numpy/ma/core.py:2832: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray\n",
            "  order=order, subok=True, ndmin=ndmin)\n",
            "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:20: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.collections.PathCollection at 0x7f05523effd0>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 13
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "DLlCYvmmpDj2",
        "outputId": "7b8408a5-e6f0-4591-ce97-42b1b7f8ef4d"
      },
      "source": [
        "# Optimal weights\n",
        "\n",
        "weights_on_risk_free = 1 - index_comp_port / num\n",
        "weights_on_risky = (index_comp_port / num) * np.array(weights[ind_max_sharpe,:])\n",
        "\n",
        "optimal_weights = [weights_on_risk_free, weights_on_risky.tolist()[0]]\n",
        "\n",
        "print('Invest {:.5f}% on risk free assets'.format(100*np.round(weights_on_risk_free,5)))\n",
        "\n",
        "for i in range(n):\n",
        "    print('Invest {0}% on Stock {1}'.format(100*np.round(weights_on_risky.tolist()[0][i],5),codes[i]))"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Invest 58.00000% on risk free assets\n",
            "Invest 4.015% on Stock 000002\n",
            "Invest 36.719% on Stock 000100\n",
            "Invest 1.266% on Stock 000776\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "CPrL7BoOpNS5",
        "outputId": "4333149e-5b7d-47a4-9bb6-6359b0371a35"
      },
      "source": [
        "np.round(weights_on_risky.tolist()[0][i],5)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "0.01266"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 15
        }
      ]
    }
  ]
}